import fs from "file-saver";
import * as XLSX from "xlsx";

/**
 * 导出 Excel 数据
 * @param {*} data 要导出的数据，为 JSON 数组
 * @param {*} fields 导出的 Excel 列名集合
 * @param {*} sheetName Excel sheet 名称
 * @param {*} filename 导出的文件名称，默认为 "file.xlsx", 名称不需要带扩展名。
 */
export default (data, fields, sheetName, filename = "file.xlsx") => {
	data.forEach((item) => {
		for (let prop in item) {
			//if (fields.hasOwnProperty(prop)) {
			if (Object.prototype.hasOwnProperty.call(fields, prop)) {
				item[fields[prop]] = item[prop];
			}
			// 若数据集合对象中没有与导出列匹配的字段，则删除
			if (prop !== fields[prop])
				delete item[prop];
		}
	});

	const sheetName2 = sheetName; // excel的文件名称
	const wb = XLSX.utils.book_new(); // 工作簿对象包含一SheetNames数组，以及一个表对象映射表名称到表对象。XLSX.utils.book_new实用函数创建一个新的工作簿对象。
	const ws = XLSX.utils.json_to_sheet(data, { header: Object.values(fields) }); // 将JS对象数组转换为工作表。
	wb.SheetNames.push(sheetName2);
	wb.Sheets[sheetName2] = ws;
	const defaultCellStyle = {
		font: { name: "Verdana", sz: 13, color: "FF00FF88" },
		fill: { fgColor: { rgb: "FFFFAA00" } },
	}; //设置表格的样式
	const wopts = {
		bookType: "xlsx",
		bookSST: false,
		type: "binary",
		cellStyles: true,
		defaultCellStyle: defaultCellStyle,
		showGridLines: false,
	}; //写入的样式
	const wbout = XLSX.write(wb, wopts);
	const blob = new Blob([s2ab(wbout)], { type: "application/octet-stream" });
	fs.saveAs(blob, filename + ".xlsx");
};

const s2ab = (s) => {
	if (typeof ArrayBuffer !== "undefined") {
		const buf = new ArrayBuffer(s.length);
		const view = new Uint8Array(buf);
		for (let i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;
		return buf;
	} else {
		const bufs = new Array(s.length);
		for (let j = 0; j != s.length; ++j) bufs[j] = s.charCodeAt(j) & 0xff;
		return bufs;
	}
};
